package com.insight.modules.system.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import com.insight.common.system.vo.LoginUser;
import com.insight.modules.system.entity.SysUsers;
import com.insight.modules.system.model.SysUserSysDepartModel;
import com.insight.modules.system.vo.SysUserDepVo;
import com.insight.modules.system.vo.SysUserRoleVO;
import com.insight.modules.system.vo.UserVo;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * <p>
 * 用户表 Mapper 接口
 * </p>
 *
 * @Author scott
 * @since 2018-12-20
 */
@Component
public interface SysUserMapper extends BaseMapper<SysUsers> {

	/**
	 * 根据用户名查询用户信息
	 * @param username 用户账号
	 * @return 用户实体对象，如果不存在返回null
	 */
	SysUsers getUserByName(@Param("username") String username);

	/**
	 * 根据部门ID分页查询用户信息，支持用户名模糊查询
	 * @param page 分页参数
	 * @param departId 部门ID
	 * @param username 用户名模糊匹配
	 * @return 分页后的用户列表
	 */
	IPage<SysUsers> getUserByDepId(Page page, @Param("departId") String departId, @Param("username") String username);

	/**
	 * 根据用户ID列表查询对应的部门名称信息
	 * @param userIds 用户ID列表
	 * @return 用户与部门名称对应列表
	 */
	List<SysUserDepVo> getDepNamesByUserIds(@Param("userIds") List<String> userIds);

	/**
	 * 根据多个部门ID分页查询部门下用户信息，支持用户名模糊查询
	 * @param page 分页参数
	 * @param departIds 部门ID列表
	 * @param username 用户名模糊匹配
	 * @return 分页后的用户列表
	 */
	IPage<SysUsers> getUserByDepIds(Page page, @Param("departIds") List<String> departIds, @Param("username") String username);

	/**
	 * 根据部门ID查询该部门下所有用户（无分页）
	 * @param departId 部门ID
	 * @return 用户列表
	 */
	List<SysUsers> selectUserByDepId(String departId);

	/**
	 * 根据角色ID分页查询角色对应的用户信息，支持用户名和真实姓名模糊查询
	 * @param page 分页参数
	 * @param roleId 角色ID
	 * @param username 用户名模糊匹配
	 * @param realname 真实姓名模糊匹配
	 * @return 分页后的用户列表
	 */
	IPage<SysUsers> getUserByRoleId(Page page, @Param("roleId") String roleId, @Param("username") String username, @Param("realname") String realname);

	/**
	 * 根据用户ID列表查询用户对应的角色信息
	 * @param userIds 用户ID列表
	 * @return 用户角色对应列表
	 */
	List<SysUserRoleVO> getRoleByUserIds(@Param("userIds") List<String> userIds);

	/**
	 * 根据用户名更新用户所属部门编码
	 * @param username 用户名
	 * @param orgCode 部门编码
	 */
	void updateUserDepart(@Param("username") String username, @Param("orgCode") String orgCode);

	/**
	 * 根据手机号查询用户信息
	 * @param phone 手机号
	 * @return 用户实体
	 */
	SysUsers getUserByPhone(@Param("phone") String phone);

	/**
	 * 根据邮箱查询用户信息
	 * @param email 邮箱地址
	 * @return 用户实体
	 */
	SysUsers getUserByEmail(@Param("email") String email);

	/**
	 * 根据部门编码分页查询该部门及子部门下的用户信息，支持用户查询条件
	 * @param page 分页对象
	 * @param orgCode 部门编码
	 * @param userParams 用户查询条件，可为空
	 * @return 用户及部门模型列表
	 */
	List<SysUserSysDepartModel> getUserByOrgCode(IPage page, @Param("orgCode") String orgCode, @Param("userParams") SysUsers userParams);

	/**
	 * 查询 getUserByOrgCode 方法的总记录数，用于分页
	 * @param orgCode 部门编码
	 * @param userParams 用户查询条件，可为空
	 * @return 总记录数
	 */
	Integer getUserByOrgCodeTotal(@Param("orgCode") String orgCode, @Param("userParams") SysUsers userParams);

	/**
	 * 批量删除角色与用户的关联关系
	 * @param roleIdArray 角色ID数组
	 */
	void deleteBathRoleUserRelation(@Param("roleIdArray") String[] roleIdArray);

	/**
	 * 批量删除角色与权限的关联关系
	 * @param roleIdArray 角色ID数组
	 */
	void deleteBathRolePermissionRelation(@Param("roleIdArray") String[] roleIdArray);

	/**
	 * 查询逻辑删除（软删除）的用户列表
	 * @param wrapper 查询条件包装器
	 * @return 逻辑删除的用户列表
	 */
	List<SysUsers> selectLogicDeleted(@Param(Constants.WRAPPER) Wrapper<SysUsers> wrapper);

	/**
	 * 还原逻辑删除的用户
	 * @param userIds 用户ID字符串（逗号分隔）
	 * @param entity 用户实体，更新的字段信息
	 * @return 影响行数
	 */
	int revertLogicDeleted(@Param("userIds") String userIds, @Param("entity") SysUsers entity);

	/**
	 * 彻底删除逻辑删除的用户（物理删除）
	 * @param userIds 用户ID字符串（逗号分隔）
	 * @return 影响行数
	 */
	int deleteLogicDeleted(@Param("userIds") String userIds);

	/**
	 * 将指定字段中空字符串更新为null（此方法存在SQL注入风险，慎用）
	 * @param fieldName 字段名
	 * @return 影响行数
	 */
	int updateNullByEmptyString(@Param("fieldName") String fieldName);

	/**
	 * 根据多个部门ID查询对应部门下用户列表，支持用户名模糊查询
	 * @param departIds 部门ID列表
	 * @param username 用户名模糊匹配
	 * @return 用户列表
	 */
	List<SysUsers> queryByDepIds(@Param("departIds") List<String> departIds, @Param("username") String username);

	/**
	 * 获取用户信息映射，key为用户登录名，value为用户真实姓名
	 * @return 用户列表
	 */
	List<SysUsers> getUserMap();

	/**
	 * 获取所有用户列表
	 * @return 用户列表
	 */
	List<SysUsers> getUserList();

	/**
	 * 根据状态和删除标识查询用户列表
	 * @param status 用户状态
	 * @param del_flag 删除标识
	 * @return 用户列表
	 */
	List<SysUsers> selectUserList(@Param("status") String status, @Param("del_flag") String del_flag);

	/**
	 * 根据用户名查询登录用户信息
	 * @param username 用户名
	 * @return 登录用户信息对象
	 */
	LoginUser getUsersByLoginUser(@Param("username") String username);

	/**
	 * 根据用户ID查询真实姓名
	 * @param ownerId 用户ID
	 * @return 真实姓名
	 */
	String selectRealnameByUsername(String ownerId);

	/**
	 * 根据用户ID查询用户ID（疑似冗余）
	 * @param userid 用户ID
	 * @return 用户ID
	 */
	String getUserid(@Param("userid") String userid);

	/**
	 * 更新用户锁定状态及锁定时间
	 * @param lock 锁定标识（0：解锁，1：锁定）
	 * @param locksTime 锁定时间字符串
	 * @param username 用户名
	 */
	void updateLock(@Param("lock") int lock, @Param("locksTime") String locksTime, @Param("username") String username);

	/**
	 * 根据用户ID查询用户信息
	 * @param s 用户ID
	 * @return 用户实体
	 */
	SysUsers getByUId(@Param("s") String s);

	/**
	 * 根据用户名查询用户信息（特殊查询）
	 * @param s 用户名
	 * @return 用户实体
	 */
	SysUsers getUserByNameSpec(String s);

	/**
	 * 根据用户ID列表查询用户信息
	 * @param sentTo 用户ID列表
	 * @return 用户列表
	 */
	List<SysUsers> getUserByIds(@Param("sendTo") List<String> sentTo);

	/**
	 * 逻辑删除用户（软删除）
	 * @param userId 用户ID
	 */
	void deleteLogic(@Param("userId") String userId);

	/**
	 * 根据角色编码查询用户列表
	 * @param roleCodes 角色编码（多个用逗号分隔）
	 * @return 用户列表
	 */
	List<LoginUser> listUsersByRoleCode(@Param("roleCodes") String roleCodes);

	/**
	 * 根据用户名列表查询用户ID列表
	 * @param users 用户名列表
	 * @return 用户ID列表
	 */
	List<String> getUserByNames(@Param("users") List<String> users);

	/**
	 * 根据部门ID查询用户视图列表
	 * @param deptId 部门ID
	 * @return 用户视图列表
	 */
	List<UserVo> list(@Param("deptId") String deptId);

	/**
	 * PostgreSQL下根据部门ID查询用户视图列表
	 * @param deptId 部门ID
	 * @return 用户视图列表
	 */
	List<UserVo> listByPostgresql(@Param("deptId") String deptId);

	/**
	 * 根据用户ID查询所属部门ID列表
	 * @param userId 用户ID
	 * @return 部门ID列表
	 */
	List<String> getDepartIdByUserId(@Param("userId") String userId);

	/**
	 * 查询删除标记的ID列表
	 * @return ID列表
	 */
	List<String> selectDELIds();

	/**
	 * 根据ID列表批量删除用户
	 * @param perList 用户ID列表
	 * @return 影响行数
	 */
	int deleteByIdS(List<String> perList);

	/**
	 * 根据前缀查询用户编号列表
	 * @param prefix 编号前缀
	 * @return 用户编号列表
	 */
	List<String> selectNumbers(@Param("prefix") String prefix);

	/**
	 * 根据用户名列表查询真实姓名列表
	 * @param users 用户名列表
	 * @return 真实姓名列表
	 */
	List<String> getRealNameByNames(@Param("users") List<String> users);

	/**
	 * 查询所有用户ID
	 * @return 用户ID列表
	 */
	List<String> getAllUserId();

	/**
	 * 根据用户ID字符串批量物理删除用户
	 * @param userIds 用户ID字符串（逗号分隔）
	 * @return 影响行数
	 */
	int deleteDirectly(@Param("userIds") String userIds);

	/**
	 * 根据用户名列表查询登录用户列表
	 * @param users 用户名列表
	 * @return 登录用户列表
	 */
	List<LoginUser> getLoginUserByNames(List<String> users);

	/**
	 * 根据条件分页查询带部门ID的用户列表
	 * @param page 分页对象
	 * @param sysUser 查询条件实体
	 * @return 分页用户列表
	 */
	IPage<SysUsers> getUsersWithDeptIds(Page<SysUsers> page, @Param("user") SysUsers sysUser);
}

